﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace Platform.Infrastructure
{
	internal static class Arguments
	{
		public static void IsNotNullOrEmpty( string name, string value )
		{
			Debug.Assert( !String.IsNullOrEmpty( name ), "Não foi passado o nome do parâmetro." );
			if ( String.IsNullOrEmpty( value ) )
				throw new ArgumentNullException( name );
		}

		public static void IsNotNull( string name, object value )
		{
			Debug.Assert( !String.IsNullOrEmpty( name ), "Não foi passado o nome do parâmetro." );
			if ( value == null )
				throw new ArgumentNullException( name );
		}

		public static void IsInRange( string name, int value, int startInclusive, int endInclusive )
		{
			Debug.Assert( !String.IsNullOrEmpty( name ), "Não foi passado o nome do parâmetro" );
			if ( value < startInclusive
				|| value > endInclusive )
			{
				throw new IndexOutOfRangeException( String.Format( "O valor para o parâmetro \"{0}\" deve ser entre \"{1}\" e \"{2}\".\nValor atual: {3}", name, startInclusive, endInclusive, value ) );
			}
		}

		public static void DontHaveInvalidChars( string name, string value, params char[] invalid )
		{
			Debug.Assert( name != null );

			if ( value != null
				&& invalid != null )
			{
				if ( value.Intersect( invalid ).Any() )
				{
					throw new ArgumentException( String.Format( "O parâmetro \"{0}\" não aceita os caracters: {1}.", name, invalid.Join( "'", "', '", "'" ) ) );
				}
			}
		}
	}
}
